package penjat;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.GridLayout;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowEvent;
import java.io.File;
import java.io.FileNotFoundException;
import java.util.LinkedList;
import javax.swing.BorderFactory;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.swing.UIManager;


/** Classe gràfica que simula el funcionament del Joc del Penjat.
 * Utilitza una classe GestiFitxers per importar un nou diccionari i afegir
 * paraules noves al diccionari en curs @see penjat.GestioFitxers
 * El model de joc es troba a la classe @see penjat.JocPenjat
 * Es tenen 6 intents per endevinar la paraula.
 * Hi han 6 imatge segons els errors comesos.
 * 
 * @author Montse Madridejos
 * @version gener 2012
 */
public class GUIPenjat extends JFrame implements ActionListener {
/* Les variables booleanes firstTime, mostrarInstruccions les utilitzo per
 * a què els events es facin com es vol, refrescant quan toca, sino no va.
 */
    /* Part grafica */
    private char lletraPulsada;
    private boolean firstTime = true;
    private boolean mostrarInstruccions = false;
    private JButton[] lletres;
    private JPanel panel1; /* panell per les lletres*/
    private JPanel panel2; /* panell per la imatge*/
    private JPanel panel3; /* per les etiquetes */
    private JLabel text; /* per la paraula amb guions */
    private JLabel missatges; /* guanya o perd i nº intents*/
    private JTextArea instruccions = new JTextArea();
    private ImageIcon[] imatges;
           
    
    /* Part funcional */
    private int maxIntents = 6;
    private LinkedList<String> paraulesEnCurs;
    private File diccionariEnCurs;
    private GestioFitxers gf = new GestioFitxers();
    private JocPenjat joc;

   private void carregarImatgesParaules() {
       /*
        * IMPORTANTÍSSIM, ELS NOMS DE LES IMATGES .JPG no va si es diu .jpg 
        */
        imatges = new ImageIcon[8];
        imatges[0] = new ImageIcon(Toolkit.getDefaultToolkit().
                createImage(getClass().getResource("/img/0.jpg")));
        imatges[1] = new ImageIcon(Toolkit.getDefaultToolkit().
                createImage(getClass().getResource("/img/1.jpg")));
        imatges[2] = new ImageIcon(Toolkit.getDefaultToolkit().
                createImage(getClass().getResource("/img/2.jpg")));
        imatges[3] = new ImageIcon(Toolkit.getDefaultToolkit().
                createImage(getClass().getResource("/img/3.jpg")));
        imatges[4] = new ImageIcon(Toolkit.getDefaultToolkit().
                createImage(getClass().getResource("/img/4.jpg")));
        imatges[5] = new ImageIcon(Toolkit.getDefaultToolkit().
                createImage(getClass().getResource("/img/5.jpg")));
        imatges[6] = new ImageIcon(Toolkit.getDefaultToolkit().
                createImage(getClass().getResource("/img/6.jpg")));
        imatges[7] = new ImageIcon(Toolkit.getDefaultToolkit().
                createImage(getClass().getResource("/img/7.jpg")));
    }

    
    private void colocarMenu() {
        JMenu menuFitxer;
        JMenu menuAjuda;
        JMenuBar barra;
        menuFitxer = new JMenu("Fitxer");
        menuFitxer.setMnemonic('F');
        JMenuItem obrirMenu = new JMenuItem("Nova Paraula = Nou Joc");
        obrirMenu.setMnemonic('O');
        menuFitxer.add(obrirMenu);
        /* per cada opcio del menu un ActionListener */
        obrirMenu.addActionListener(new GestioNovaPartida());
        /******************************************************************/
        JMenuItem importarSpanishMenu = new JMenuItem("Importar diccionari");
        importarSpanishMenu.setMnemonic('I');
        menuFitxer.add(importarSpanishMenu);
        /* per cada opcio del menu un ActionListener */
        importarSpanishMenu.addActionListener(new GestioImportar());
        /******************************************************************/
        JMenuItem afegirMenu = new JMenuItem("Afegir paraula al diccionari");
        afegirMenu.setMnemonic('A');
        menuFitxer.add(afegirMenu);
        /* per cada opcio del menu un ActionListener */
        afegirMenu.addActionListener(new GestioAfegirParaula());
        /******************************************************************/
        JMenuItem tancarMenu = new JMenuItem("Tancar");
        tancarMenu.setMnemonic('T');
        menuFitxer.add(tancarMenu);
        /* per cada opcio del menu un ActionListener */
        /* aqui utilitzo una classe interna anonima a tall d'exemple */
        tancarMenu.addActionListener(new GestioTancar());

        /* el menu s'ha d'inserir en una barra de menu */
        barra = new JMenuBar();
        setJMenuBar(barra);
        barra.add(menuFitxer);
        /******************************************************************************/
        /* Menu Ajuda */
        menuAjuda = new JMenu("Ajuda");
        menuAjuda.setMnemonic('A');
        JMenuItem instr = new JMenuItem("Instruccions");
        instr.setMnemonic('I');
        /* per cada opcio del menu un ActionListener */
        instr.addActionListener(new GestioInstruccions());
        menuAjuda.add(instr);

        JMenuItem about = new JMenuItem("About");
        about.setMnemonic('A');
        about.addActionListener(new GestioAbout());
        menuAjuda.add(about);
        barra.add(menuAjuda);
    }

    private void colocarLletres() {
        char lletra = 'A';
        panel1 = new JPanel();
        panel1.setBackground(Color.white);
        panel1.setLayout(new GridLayout(4, 7));
        lletres = new JButton[28];
        /* A to Z*/
        for (int i = 0; i < 26; i++) {
            lletres[i] = new JButton("" + lletra);
            lletres[i].setBackground(Color.LIGHT_GRAY);
            lletres[i].addActionListener(this);
            lletra++;
        }
        lletres[26] = new JButton("Ñ");
        lletres[26].setBackground(Color.LIGHT_GRAY);
        lletres[26].addActionListener(this);
        /* visualment, inserim la Ñ en ordre */

        lletres[27] = new JButton("Ç");
        lletres[27].setBackground(Color.LIGHT_GRAY);
        lletres[27].addActionListener(this);
        /* visualment, inserim la Ç en ordre */
        for (int i = 0; i < 3; i++) {
            panel1.add(lletres[i]);
        }
        panel1.add(lletres[27]);
        /* de la ç a la N */
        for (int i = 3; i < 14; i++) {
            panel1.add(lletres[i]);
        }
        /*afegir la Ñ */
        panel1.add(lletres[26]);
        /* afegir la resta de lletrres*/
        for (int i = 14; i < 26; i++) {
            panel1.add(lletres[i]);
        }
    }

    private void colocarObjectesGrafics() {
	    
        /* ample, altura en pixels */
        setSize(500, 500);
        setVisible(true);
        setIconImage(Toolkit.getDefaultToolkit().createImage(getClass().getResource("/img/icons/flor.png")));
        //setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        colocarMenu();
        setLayout(new BorderLayout());
        setResizable(false);
        colocarLletres();
        add(panel1, "North");
        panel2 = new JPanel();
        panel2.setBackground(Color.white);
        //borde de color negre
        panel2.setBorder(BorderFactory.createLineBorder(Color.black));
        instruccions = new JTextArea();
        instruccions.setEditable(false);
        panel2.add(instruccions);
        add(panel2, "Center");
        panel3 = new JPanel();
        panel3.setLayout(new GridLayout(1, 2));
        text = new JLabel();
        text.setFont(new Font("Monospaced", Font.BOLD, 20));
        panel3.add(text);
        missatges = new JLabel("");
        missatges.setFont(new Font("Monospaced", Font.BOLD, 15));
        panel3.add(missatges);
        add(panel3, "South");
    }

    public GUIPenjat() {
        super("El Penjat");
        /* Per defecte s'agafa una paraula sempre.
         * Si l'usuari utilitza els menús es canvia la paraula 
         */
        joc = new JocPenjat();
        paraulesEnCurs = joc.getLlistaParaules();
       carregarImatgesParaules();
        colocarObjectesGrafics();
        addWindowListener(new java.awt.event.WindowAdapter() {

            public void windowClosing(WindowEvent winEvt) {
                /* guardar la llista en curs al fitxer del diccionari en curs*/
                try {
                    gf.gravarLlistaAFitxer(paraulesEnCurs, diccionariEnCurs);
                } catch (FileNotFoundException ex) {
                    missatges.setText("Problemes d'E/S");
                }
                System.exit(0);
            }
        });      
        text.setText(joc.getParaulaGuions());
        missatges.setText("Et queden "+maxIntents+" intents");
        /* posar del color original */
        for (int i = 0; i < 28; i++) {
            lletres[i].setBackground(Color.LIGHT_GRAY);
        }
      //  System.out.println("firstTime="+firstTime);
      //  System.out.println("MostrarInstruccions="+mostrarInstruccions);
        repaint();
    }

    private void inactivarBotons() {
        for (int i = 0; i < lletres.length; i++) {
            lletres[i].setBackground(Color.white);
            lletres[i].setEnabled(false);
        }
    }

    public void paint(Graphics g) {
        super.paint(g);
        if (mostrarInstruccions) {
            mostrarInstruccions = false;
        } else {
            if (!firstTime) {
     
                text.setText(joc.getParaulaGuions());
                if (joc.guanyar()) {
                    /* 25 es desde l'esquerra, 190 es des de dalt */
                    g.drawImage(imatges[7].getImage(), 25, 190, this);
                    missatges.setText("Has guanyat!");
                    inactivarBotons();
                } else {
                    int queden = maxIntents - joc.getErrors();
                    if (queden > 1) {
                        missatges.setText("Et queden "+ queden+" intents");
                    } else {
                        missatges.setText("Et queda 1 intent");
                    }
                    g.drawImage(imatges[joc.getErrors()].getImage(), 25, 190, this);
                
                    if (joc.getErrors() == maxIntents) {
                        missatges.setText("Has perdut!");
                        text.setText(joc.getParaulaSecreta());
                        inactivarBotons();
                    }
                }
                /* es la primera vegada, nomes herba*/
            } else {
              //  System.out.println("hola first time");
               g.drawImage(imatges[0].getImage(), 25, 190, this);
                
            }
        }
    }

    public void actionPerformed(ActionEvent e) {
        lletraPulsada = e.getActionCommand().charAt(0);
        firstTime = false;
        mostrarInstruccions = false;
        instruccions.setVisible(false);
     //   System.out.println("Lletra pulsada=" + lletraPulsada);
        joc.avaluar(lletraPulsada);
        ((JButton) e.getSource()).setBackground(Color.CYAN);
        repaint();
    }

    public void novaPartida() {
        int pos = (int) (Math.random() * paraulesEnCurs.size());
        String paraula = paraulesEnCurs.get(pos);
        joc = new JocPenjat(paraula);  
        text.setText(joc.getParaulaGuions());
        instruccions.setVisible(false);
        missatges.setText("Et queden "+ maxIntents+" intents");
        /* posar del color original */
        for (int i = 0; i < 28; i++) {
            lletres[i].setEnabled(true);
            lletres[i].setBackground(Color.LIGHT_GRAY);
        }
        repaint();
    }

    /* classes internes per als menus*/
    class GestioNovaPartida implements ActionListener {

        @Override
        public void actionPerformed(ActionEvent e) {
            novaPartida();
        }
    }

    /* classe interna per als menus*/
    class GestioImportar implements ActionListener {

        private JFileChooser selector;

        @Override
        public void actionPerformed(ActionEvent ev) {
            /* Look and Feel */
            String nativeLF = UIManager.getSystemLookAndFeelClassName();
            try {
                UIManager.setLookAndFeel(nativeLF);
            } catch (Exception e) {
            }
            selector = new JFileChooser();
            /* seleccionar nomes fitxers */
            selector.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES);
            /* mostrar quadre de dialeg obrir fitxers */
            selector.showOpenDialog(null);
            /* guardar la referencia del fitxer */
            diccionariEnCurs = selector.getSelectedFile();
            if (diccionariEnCurs != null) {
                gf = new GestioFitxers();
                try {
                    paraulesEnCurs = gf.getLlistaParaules(diccionariEnCurs);
                    novaPartida();
                    // System.out.println(paraulesEnCurs);
                } catch (FileNotFoundException e) {
                    missatges.setText("File not found");
                }
            }

        }// fi metode actionPerformed de GestioImportar
    }

    /* classe interna per als menus*/
    class GestioAfegirParaula implements ActionListener {

        public void actionPerformed(ActionEvent e) {
            String par = JOptionPane.showInputDialog(null, "Introdueix una paraula, si us plau", "Nova paraula", JOptionPane.QUESTION_MESSAGE);
            if (par != null) {
                paraulesEnCurs.add(par.toUpperCase());
            }
        }
    }

    class GestioInstruccions implements ActionListener {

        @Override
        public void actionPerformed(ActionEvent e) {
            instruccions.setText("- Es tracta d'endevinar la paraula amagada.\n"
                    +"Tens 6 intents per fer-ho.\n"
                    +"Pots afegir un nou diccionari amb paraules a través de l'opció:\n"
                    +"Fitxer -> Importar diccionari\n"
                    +"Pots afegir una paraula al diccionari en curs a través de l'opció:\n"
                    +"Fitxer -> Afegir nova paraula\n"
                    +"Quan es tanca l'aplicació es guardaran les paraules \n"
                    + "afegides al diccionari.\n"
                    + "Have fun!");

            instruccions.setVisible(true);
            mostrarInstruccions = true;
            repaint();

        }
    }

    class GestioAbout implements ActionListener {

        @Override
        public void actionPerformed(ActionEvent e) {
            //us del JOptionPane. showMessageDialog(frame,missatge, titol, tipus_icona, icona*/
            JOptionPane.showMessageDialog(null, "Montse Madridejos\nGener 2012",
                    "Programat i dissenyat per", JOptionPane.INFORMATION_MESSAGE, 
                    new ImageIcon(Toolkit.getDefaultToolkit().createImage(getClass().getResource("/img/icons/llibreta.png"))));
        }
    }

    class GestioTancar implements ActionListener {

        @Override
        public void actionPerformed(ActionEvent e) {
            /* guardar la llista en curs al fitxer del diccionari en curs*/
            try {
                gf.gravarLlistaAFitxer(paraulesEnCurs, diccionariEnCurs);
            } catch (FileNotFoundException ex) {
                missatges.setText("Problemes d'E/S");
            }
            System.exit(0);
        }
    }

    public static void main(String[] args) {
        GUIPenjat ini = new GUIPenjat();
    }
}
